ANSA建立Entity
的function
是base.CreateEntity
,一般需要三個參數,deck
、element_type
及fields
。
deck
是solver的種類,type
為int
,可以從constants
模組中取得,例如LS-DYNA為constants.LSDYNA
,Nastran則為costants.NASTRAN
。
element_type
是card
的種類,type
為str
。不同的solver可能會用不同的名稱來描述同一種element_type
。例如: shell
在Nastran這個deck
下稱為SHELL
,但在LS-DYNA則稱為ELEMENT_SHELL
。如果剛開始接觸ANSA,不太確定element_type
的字串時,可以透過GUI的介面確認。
fields
是描述這個Entity
的內容,type
為dict
。每一種Entity
有不同種類的fields
,要想知道該Entity
有哪些fields
的話,可以透過Entity.card_fields
這個function
來取得。
舉例來說,這裡我們建立一個座標為(1,2,3)
的node Entity
。
from ansa import base, constants
def create_node1():
deck = constants.LSDYNA
type_ = 'NODE'
fields = {'X': 1, 'Y': 2, 'Z': 3}
node = base.CreateEntity(deck, type_, fields)
card_fields = node.card_fields(deck)
print(f'create_node1: {node=}')
print(f'{card_fields=}')
首先我們從ANSA中import base
及constants
兩個模組,接著照順序定義上述三個參數。
deck
為constants.LSDYNA
。element_type
(變數名為type_
)為NODE
。fields
為{'X': 1, 'Y': 2, 'Z': 3}
。查看輸出,發現可順利產生一個id
為1
的node Entity
。
create_node1: node=<Entity: 0x7f67563b6000: type: 1101(1101,N_GRID) id:-1>
藉由node.card_fields
則可以觀察這個node Entity
所擁有的card_fields
。如果想同時建立node Entity
並指定其id
的話,必須於呼叫base.CreateEntity
時,將加入NID
這個欄位到上述的fields
內。
card_fields=['TYPE', 'NID', 'X', 'Y', 'Z', 'TC', 'RC', 'Name', 'FROZEN_ID', 'FROZEN_DELETE', 'DEFINED', 'AUXILIARY', 'Comment', 'MBContainer', 'MBContainers']
當Entity
建立失敗的時候,base.CreateEntity
會回傳None
。
def create_node2():
deck = constants.LSDYNA
type_ = 'NODE'
wrong_fields = {'X': 1, 'Y': 2, 'z': 3} # 'z' should be 'Z'
node = base.CreateEntity(deck, type_, wrong_fields)
print(f'create_node2: {node=}')
其輸出為:
create_node2: node=None
當需要更多的資訊來debug,可以給定debug=constants.REPORT_ALL
。
def create_node3():
deck = constants.LSDYNA
type_ = 'NODE'
wrong_fields = {'X': 1, 'Y': 2, 'z': 3} # 'z' should be 'Z'
node = base.CreateEntity(deck, type_, wrong_fields,
debug=constants.REPORT_ALL)
print(f'create_node3: {node=}')
此時base.CreateEntity
會回傳一個具有兩個元素的tuple
,第一個元素是回傳值,第二個元素是含有錯誤訊息的dict
(如果沒有錯誤訊息,則會是一個空的dict
)。
create_node3: node=(None, {'z': {'type': 'error', 'message': 'Field not found!'}})
最後,當遇到無法使用base.CreateEntity
來建立想要Entity
的時候,通常代表該種Entity
有特殊的create function
。
如container
內的part
及group
,需使用base.NewPart
及base.NewGroup
來建立;load curve
需使用base.CreateLoadCurve
來建立。
ANSA內刪除Entity
的function
是base.DeleteEntity
,一般只需要一個變數,單個Entity
或是一個包含多個Entity
的list
。
def delete_node():
deck = constants.LSDYNA
node1 = base.CreateEntity(deck, 'NODE', {'X': 0, 'Y': 0, 'Z': 0})
node2 = base.CreateEntity(deck, 'NODE', {'X': 10, 'Y': 0, 'Z': 0})
node3 = base.CreateEntity(deck, 'NODE', {'X': 10, 'Y': 10, 'Z': 0})
del_node1 = base.DeleteEntity(node1)
print(f'{del_node1=}')
del_node2_3 = base.DeleteEntity([node2, node3])
print(f'{del_node2_3=}')
如果全部給定的Entity
都成功刪除,會回傳0
,否則則回傳1
。
del_node1=0
del_node2_3=0
如同建立Entity
時一樣,偶爾會遇到無法刪除的Entity
,此時需要到base
模組裡找找,是不是該Entity
有特殊的刪除function
,如base.DeletePart
或base.DeleteCurves
等。